/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import bean.Curso;
import bean.PPP;
import java.io.Serializable;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author fernando
 */
public class PPPDao implements Serializable {

    private Conexao conexao;
    private PreparedStatement ps;

    public PPPDao() {
        conexao = new ConexaoPostgres();
    }

    public boolean cadastrarPPP(PPP ppp, int idCurso) {
        boolean resultado = false;

        if ((ppp.getPdf().getConteudo() == null || ppp.getPdf().getConteudo().length == 0 ) && (ppp.getMatrizCurricular().getConteudo() == null || ppp.getMatrizCurricular().getConteudo().length == 0) ) {
            try {
                ps = conexao.getConnection().prepareStatement("INSERT INTO ppp (id_curso, resumo, data_aprovacao, link_trabalhos_finais, tipologia_tf) VALUES (?, ?, ?, ?, ?)");

                ps.setInt(1, idCurso);
                ps.setString(2, ppp.getResumo());
                Date data = new Date(ppp.getDataAprovacao().getTime());
                ps.setDate(3, data);
                ps.setString(4, ppp.getRepositorioTrabalhosFinais());
                ps.setString(5, ppp.getTipologiaTrabalhoFinal());

                ps.executeUpdate();
                conexao.closeConnection();
                resultado = true;

            } catch (SQLException ex) {
                Logger.getLogger(PPPDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        } else if ((ppp.getPdf().getConteudo() == null || ppp.getPdf().getConteudo().length == 0 ) && ppp.getMatrizCurricular().getConteudo().length > 0) {

            try {
                ps = conexao.getConnection().prepareStatement("INSERT INTO ppp (id_curso, resumo, data_aprovacao, link_trabalhos_finais, matriz_curricular, tipologia_tf) VALUES (?, ?, ?, ?, ?, ?)");

                ps.setInt(1, idCurso);
                ps.setString(2, ppp.getResumo());
                Date data = new Date(ppp.getDataAprovacao().getTime());
                ps.setDate(3, data);
                ps.setString(4, ppp.getRepositorioTrabalhosFinais());
                ps.setInt(5, new ImagemDao().cadastrarImagem(ppp.getMatrizCurricular()));
                ps.setString(6, ppp.getTipologiaTrabalhoFinal());

                ps.executeUpdate();
                conexao.closeConnection();
                resultado = true;

            } catch (SQLException ex) {
                Logger.getLogger(PPPDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        } else if (ppp.getPdf().getConteudo().length > 0 && (ppp.getMatrizCurricular().getConteudo() == null || ppp.getMatrizCurricular().getConteudo().length == 0)) {
            try {
                ps = conexao.getConnection().prepareStatement("INSERT INTO ppp (id_curso, resumo, data_aprovacao, link_trabalhos_finais, pdf, tipologia_tf) VALUES (?, ?, ?, ?, ?, ?)");

                ps.setInt(1, idCurso);
                ps.setString(2, ppp.getResumo());
                Date data = new Date(ppp.getDataAprovacao().getTime());
                ps.setDate(3, data);
                ps.setString(4, ppp.getRepositorioTrabalhosFinais());
                ps.setInt(5, new PDFDao().cadastrarPDF(ppp.getPdf()));
                ps.setString(6, ppp.getTipologiaTrabalhoFinal());

                ps.executeUpdate();
                conexao.closeConnection();
                resultado = true;

            } catch (SQLException ex) {
                Logger.getLogger(PPPDao.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if((new PDFDao().validarInsercaoPdf(ppp.getPdf().getNome()) && (new ImagemDao().validarCadastroImagem(ppp.getMatrizCurricular().getNome())))) {

            try {
                ps = conexao.getConnection().prepareStatement("INSERT INTO ppp (id_curso, resumo, data_aprovacao, link_trabalhos_finais, pdf, matriz_curricular, tipologia_tf) VALUES (?, ?, ?, ?, ?, ?, ?)");

                ps.setInt(1, idCurso);
                ps.setString(2, ppp.getResumo());
                Date data = new Date(ppp.getDataAprovacao().getTime());
                ps.setDate(3, data);
                ps.setString(4, ppp.getRepositorioTrabalhosFinais());
                ps.setInt(5, new PDFDao().cadastrarPDF(ppp.getPdf()));
                ps.setInt(6, new ImagemDao().cadastrarImagem(ppp.getMatrizCurricular()));
                ps.setString(7, ppp.getTipologiaTrabalhoFinal());
                ps.executeUpdate();
                conexao.closeConnection();
                resultado = true;

            } catch (SQLException ex) {
                Logger.getLogger(PPPDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }



        return resultado;
    }

    public PPP buscarPPP(int id) {
        PPP ppp = new PPP();
        try {
            ps = conexao.getConnection().prepareStatement("SELECT resumo, data_aprovacao, link_trabalhos_finais, pdf, matriz_curricular, tipologia_tf FROM ppp WHERE id = ?");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();



            if (rs.next()) {

                ppp.setId(id);
                if (rs.getInt("matriz_curricular") > 0) {
                    ppp.setMatrizCurricular(new ImagemDao().consultarImagem(rs.getInt("matriz_curricular")));
                }
                if (rs.getInt("pdf") > 0) {
                    ppp.setPdf(new PDFDao().consultarPDF(rs.getInt("pdf")));
                }

                ppp.setDataAprovacao(rs.getDate("data_aprovacao"));
                ppp.setRepositorioTrabalhosFinais(rs.getString("link_trabalhos_finais"));
                ppp.setResumo(rs.getString("resumo"));
                ppp.setTipologiaTrabalhoFinal(rs.getString("tipologia_tf"));


            }

        } catch (SQLException ex) {
            Logger.getLogger(PPPDao.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ppp;
    }

    public List<PPP> buscarPPPsCurso(int idCurso) {
        ArrayList<PPP> listaPPPs = new ArrayList<PPP>();
        try {
            ps = conexao.getConnection().prepareStatement("SELECT * FROM ppp WHERE id_curso = ?");
            ps.setInt(1, idCurso);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();



            while (rs.next()) {
                PPP ppp = new PPP();
                ppp.setId(rs.getInt("id"));
                if (rs.getInt("matriz_curricular") > 0) {
                    ppp.setMatrizCurricular(new ImagemDao().consultarImagem(rs.getInt("matriz_curricular")));
                }
                if (rs.getInt("pdf") > 0) {
                    ppp.setPdf(new PDFDao().consultarPDF(rs.getInt("pdf")));
                }

                ppp.setDataAprovacao(rs.getDate("data_aprovacao"));
                ppp.setRepositorioTrabalhosFinais(rs.getString("link_trabalhos_finais"));
                ppp.setResumo(rs.getString("resumo"));
                ppp.setTipologiaTrabalhoFinal(rs.getString("tipologia_tf"));

                listaPPPs.add(ppp);
            }

        } catch (SQLException ex) {
            Logger.getLogger(PPPDao.class.getName()).log(Level.SEVERE, null, ex);
        }


        return listaPPPs;


    }

    public boolean alterarPPP(PPP ppp) {
        boolean retorno = false;
        try {
            System.out.println("Id ppp alterado:" + ppp.getId());
            ps = conexao.getConnection().prepareStatement("UPDATE ppp SET resumo = ?, data_aprovacao = ?, link_trabalhos_finais = ?, tipologia_tf = ?  WHERE id = ? ");
            ps.setString(1, ppp.getResumo());
            ps.setDate(2, new Date(ppp.getDataAprovacao().getTime()));
            ps.setString(3, ppp.getRepositorioTrabalhosFinais());
            ps.setString(4, ppp.getTipologiaTrabalhoFinal());
            ps.setInt(5, ppp.getId());
            ps.executeUpdate();
            conexao.closeConnection();
            retorno = true;
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);

            return retorno;
        }


        return retorno;


    }

    public boolean alterarMatrizPPP(PPP ppp) {
        boolean retorno = false;
        try {

            ps = conexao.getConnection().prepareStatement("SELECT (matriz_curricular) FROM ppp WHERE id = ?");
            ps.setInt(1, ppp.getId());
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();

            int idImagemAnterior = 0;

            if (rs.next()) {
                idImagemAnterior = rs.getInt("id");
            }


            ImagemDao imDao = new ImagemDao();



            ps = conexao.getConnection().prepareStatement("UPDATE ppp SET matriz_curricular = ? WHERE id = ? ");
            int idMatrizCurricular = imDao.cadastrarImagem(ppp.getMatrizCurricular());
            ps.setInt(1, idMatrizCurricular);
            ps.setInt(2, ppp.getId());
            ps.executeUpdate();
            conexao.closeConnection();

            if (idImagemAnterior > 0) {
                imDao.removerImagem(idImagemAnterior);
            }
            retorno = true;

        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            return retorno;
        }
        return retorno;
    }

    public boolean removerPPP(PPP ppp) {

        boolean retorno = false;

        ImagemDao imgDao = new ImagemDao();
        imgDao.removerImagem(ppp.getMatrizCurricular().getId());
        PDFDao pdfDao = new PDFDao();
        pdfDao.removerPDF(ppp.getPdf().getId());

        try {
            ps = conexao.getConnection().prepareStatement("DELETE FROM ppp WHERE id = ?");
            ps.setInt(1, ppp.getId());
            ps.executeUpdate();
            conexao.closeConnection();
            retorno = true;

        } catch (SQLException ex) {
            Logger.getLogger(PDFDao.class.getName()).log(Level.SEVERE, null, ex);
        }


        return retorno;

    }
}
